home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- from xml.dom import minidom
- import re
- import locale
- import urllib
- import rb
- import rhythmdb
- LICENSE_KEY = '18C3VZN9HCECM5G3HQG2'
- DEFAULT_LOCALE = 'en_US'
- ASSOCIATE = 'webservices-20'
- MAX_BATCH_JOBS = 2
-
- class Bag:
- pass
-
-
- class AmazonCoverArtSearch(object):
-
- def __init__(self):
- self.searching = False
- self.cancel = False
- self.db = None
- self.entry = None
- (self.tld, self.encoding) = self._AmazonCoverArtSearch__get_locale()
-
-
- def __get_locale(self):
- supported_locales = {
- 'en_US': ('com', 'latin1'),
- 'en_GB': ('co.uk', 'latin1'),
- 'de': ('de', 'latin1'),
- 'ja': ('jp', 'utf8') }
- lc_id = DEFAULT_LOCALE
- default = locale.getdefaultlocale()[0]
- if default:
- if supported_locales.has_key(default):
- lc_id = default
- else:
- lang = default.split('_')[0]
- if supported_locales.has_key(lang):
- lc_id = lang
-
-
- return supported_locales[lc_id]
-
-
- def search(self, db, entry, on_search_completed_callback, *args):
- self.searching = True
- self.cancel = False
- self.db = db
- self.entry = entry
- self.on_search_completed_callback = on_search_completed_callback
- self.args = args
- self.keywords = []
- if not db.entry_get(entry, rhythmdb.PROP_ARTIST):
- pass
- st_artist = _('Unknown')
- if not db.entry_get(entry, rhythmdb.PROP_ALBUM):
- pass
- st_album = _('Unknown')
- if st_album == st_album:
- pass
- elif st_album == _('Unknown'):
- self.on_search_completed(None)
- return None
- for char in [
- '"']:
- st_artist = st_artist.replace(char, '')
- st_album = st_album.replace(char, '')
-
- self.st_album = st_album
- self.st_artist = st_artist
- for exp in [
- '\\([Dd]isc *[1-9]+\\)',
- '\\([Cc][Dd] *[1-9]+\\)']:
- p = re.compile(exp)
- st_album = p.sub('', st_album)
-
- st_album_no_vol = st_album
- for exp in [
- '\\(*[Vv]ol.*[1-9]+\\)*']:
- p = re.compile(exp)
- st_album_no_vol = p.sub('', st_album_no_vol)
-
- self.st_album_no_vol = st_album_no_vol
- self.search_album = st_album
- self.search_artist = st_artist
- self.search_album_no_vol = st_album_no_vol
- if st_album == _('Unknown'):
- self.keywords.append('%s Best of' % st_artist)
- self.keywords.append('%s Greatest Hits' % st_artist)
- self.keywords.append('%s Essential' % st_artist)
- self.keywords.append('%s Collection' % st_artist)
- self.keywords.append('%s' % st_artist)
- elif st_artist == _('Unknown'):
- self.keywords.append('%s' % st_album)
- if st_album_no_vol != st_artist:
- self.keywords.append('%s' % st_album_no_vol)
-
- self.keywords.append('Various %s' % st_album)
- elif st_album != st_artist:
- self.keywords.append('%s %s' % (st_artist, st_album))
- if st_album_no_vol != st_album:
- self.keywords.append('%s %s' % (st_artist, st_album_no_vol))
-
- self.keywords.append('Various %s' % st_album)
-
- self.keywords.append('%s' % st_artist)
- self.search_next()
-
-
- def search_next(self):
- if len(self.keywords) == 0:
- self.on_search_completed(None)
- return False
- self.searching = True
- url = 'http://ecs.amazonaws.' + self.tld + '/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=' + LICENSE_KEY + '&AssociateTag=' + ASSOCIATE + '&ResponseGroup=Images,ItemAttributes&Operation=ItemSearch&ItemSearch.Shared.SearchIndex=Music'
- job = 1
- while job <= MAX_BATCH_JOBS and len(self.keywords) > 0:
- keyword = self.keywords.pop(0)
- keyword = keyword.encode(self.encoding, 'ignore')
- keyword = keyword.strip()
- keyword = urllib.quote(keyword)
- url += '&ItemSearch.%d.Keywords=%s' % (job, keyword)
- job += 1
- continue
- len(self.keywords) == 0
- l = rb.Loader()
- l.get_url(url, self.on_search_response)
- return True
-
-
- def __unmarshal(self, element):
- rc = Bag()
- child_elements = _[1]
- return rc
-
-
- def on_search_response(self, result_data):
- if result_data is None:
- self.search_next()
- return None
-
- try:
- xmldoc = minidom.parseString(result_data)
- except:
- result_data is None
- self.search_next()
- return None
-
- data = self._AmazonCoverArtSearch__unmarshal(xmldoc)
- if not hasattr(data, 'ItemSearchResponse') or not hasattr(data.ItemSearchResponse, 'Items'):
- self.search_next()
- else:
- self.on_search_results(data.ItemSearchResponse.Items)
-
-
- def on_search_results(self, results):
- self.on_search_completed(results)
-
-
- def on_search_completed(self, result):
- self.on_search_completed_callback(self, self.entry, result, *self.args)
- self.searching = False
-
-
- def __tidy_up_string(self, s):
- s = s.lower()
- s = s.strip()
- s = s.replace(' - ', ' ')
- s = s.replace(': ', ' ')
- s = s.replace(' & ', ' and ')
- return s
-
-
- def __valid_match(self, item):
- if hasattr(item, 'LargeImage') or hasattr(item, 'MediumImage'):
- pass
- return hasattr(item, 'ItemAttributes')
-
-
- def get_best_match_urls(self, search_results):
- best_match = None
- for result in search_results:
- if not hasattr(result, 'Item'):
- continue
-
- items = filter(self._AmazonCoverArtSearch__valid_match, result.Item)
- if self.search_album != _('Unknown'):
- album_check = self._AmazonCoverArtSearch__tidy_up_string(self.search_album)
- for item in items:
- if not hasattr(item.ItemAttributes, 'Title'):
- continue
-
- album = self._AmazonCoverArtSearch__tidy_up_string(item.ItemAttributes.Title)
- if album == album_check:
- best_match = item
- break
- continue
- if best_match is None:
- if album.find(album_check) != -1 or album_check.find(album) != -1:
- best_match = item
- continue
-
-
- if self.search_album == _('Unknown') and self.search_artist != _('Unknown'):
- artist_check = self._AmazonCoverArtSearch__tidy_up_string(self.search_artist)
- if best_match is None:
- hit = False
- for item in items:
- if not hasattr(item.ItemAttributes, 'Artist'):
- continue
-
- for artist in item.ItemAttributes.Artist:
- artist = self._AmazonCoverArtSearch__tidy_up_string(artist)
- if artist.find(artist_check) != -1:
- best_match = item
- hit = True
- break
- continue
-
- if hit:
- break
- continue
-
-
-
- urls = _[1]
- if urls:
- return urls
-
- return []
-
-
-